package dhee;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextField;

public class Memory extends JFrame implements ActionListener {

	/**
	 * 菜单栏
	 */
	private JMenuBar bar;

	/**
	 * 菜单
	 */
	private JMenu fileMenu;

	/**
	 * 菜单项
	 */
	private JMenuItem easyLevel, normalLevel, hardLevel;

	/**
	 * 提示条
	 */
	private JTextField jTextField;

	/**
	 * 方块类数组
	 */
	private Block[] block;

	/**
	 * 图标数组
	 */
	private ImageIcon[] icon;

	/**
	 * 记忆板
	 */
	private MemoryTestPane memoryTestPane;

	/**
	 * 测试区域的列数
	 */
	private int x = 6;

	/**
	 * 测试区域的行数
	 */
	private int y = 5;

	/**
	 * 图标个数
	 */
	private int iconCount = 0;

	/**
	 * 构造器
	 */
	public Memory() {
		// 初始化菜单栏
		bar = new JMenuBar();
		// 初始化父菜单
		fileMenu = new JMenu("记忆测试");
		// 初始化子菜单
		easyLevel = new JMenuItem("初级");
		normalLevel = new JMenuItem("中级");
		hardLevel = new JMenuItem("高级");
		// 添加到父菜单
		fileMenu.add(easyLevel);
		fileMenu.add(normalLevel);
		fileMenu.add(hardLevel);
		// 添加到菜单栏
		bar.add(fileMenu);
		// 添加监听
		easyLevel.addActionListener(this);
		normalLevel.addActionListener(this);
		hardLevel.addActionListener(this);
		// 添加到框架并且定位
		add(bar, BorderLayout.NORTH);
		// 设置窗口大小及显示位置
		setBounds(100, 100, 600, 500);
		// 设置窗口可见
		setVisible(true);
		// 设置窗口大小不可更改
		setResizable(false);
		// 设置基于父窗口定位显示本窗口--居中
		setLocationRelativeTo(null);
		// 设置窗口关闭事件
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 初始化方块类数组
		block = new Block[x * y];
		// 遍历方块类数组
		for (int i = 0; i < block.length; i++) {
			block[i] = new Block();
		}
		iconCount = y;
		// 初始化图标数组
		icon = new ImageIcon[iconCount];
		// 遍历图标数组
		for (int i = 0; i < icon.length; i++) {
			icon[i] = new ImageIcon(Memory.class.getResource("a" + i + ".jpg"));
		}
		// 初始化记忆板
		memoryTestPane = new MemoryTestPane(block, icon, x, y);
		// 初始化提示条
		jTextField = new JTextField("初级：您需要连续找出6个相同图标的方块");
		// 设置提示条居中显示
		jTextField.setHorizontalAlignment(JTextField.CENTER);
		// 提示条设置不可编辑
		jTextField.setEditable(false);
		// 提示条设置字体颜色
		jTextField.setForeground(Color.red);
		// 添加记忆板并且定位
		add(memoryTestPane, BorderLayout.CENTER);
		// 添加提示条并且定位
		add(jTextField, BorderLayout.SOUTH);
		// 布局框架组件
		validate();
	}

	/**
	 * 变更测试级别
	 */
	public void changeLevel(int width, int height) {
		x = width;
		y = height;
		iconCount = y;
		// 初始化方块类数组
		block = new Block[x * y];
		// 遍历方块类数组
		for (int i = 0; i < block.length; i++) {
			block[i] = new Block();
		}
		// 初始化图标数组
		icon = new ImageIcon[iconCount];
		// 遍历图标
		for (int i = 0; i < icon.length; i++) {
			icon[i] = new ImageIcon(Memory.class.getResource("a" + i + ".jpg"));
		}
		// 移除记忆板
		remove(memoryTestPane);
		// 初始化记忆板
		memoryTestPane = new MemoryTestPane(block, icon, x, y);
		// 添加菜单栏、记忆板、提示条 并定位
		add(bar, BorderLayout.NORTH);
		add(memoryTestPane, BorderLayout.CENTER);
		add(jTextField, BorderLayout.SOUTH);
		// 布局框架组件
		validate();
	}

	/**
	 * 事件监听
	 */
	public void actionPerformed(ActionEvent e) {
		// 初级
		if (e.getSource() == easyLevel) {
			// 变更6×5面板
			changeLevel(6, 5);
			// 设置窗口大小及位置
			setBounds(100, 100, 600, 500);
			// 设置窗口居中
			setLocationRelativeTo(null);
			// 布局框架组件
			validate();
			// 变更提示条文字
			jTextField.setText("初级：您需要连续找出6个相同图标的方块");
		}
		// 中级
		if (e.getSource() == normalLevel) {
			changeLevel(7, 6);
			setBounds(100, 100, 700, 600);
			setLocationRelativeTo(null);
			validate();
			jTextField.setText("中级：您需要连续找出7个相同图标的方块");
		}
		// 高级
		if (e.getSource() == hardLevel) {
			changeLevel(8, 7);
			setBounds(100, 100, 800, 700);
			setLocationRelativeTo(null);
			validate();
			jTextField.setText("高级：您需要连续找出8个相同图标的方块");
		}
	}

	/**
	 * 主方法
	 */
	public static void main(String[] args) {
		new Memory();
	}
}
